package com.bbva.kyfb.kyfbws.services.v01;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.httpService.HttpService;
import com.bbva.kyfb.kyfbbofc.IFicherosBo;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroConfeccion;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroInfo;
import com.bbva.kyfb.kyfbdto.firmas.bo.UsuarioInfo;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdto.firmas.fachada.interfaces.v01.IServicioFicheroConfeccionV01;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.DeletedFilesResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoDeletedFile;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoDeletedFiles;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFile;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAudit;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAuditRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAuditResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileCompanie;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileCompaniesRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileCompaniesResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileMiFID;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileMiFIDRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileMiFIDResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoToDeleteRequestMaking;
import com.bbva.kyfb.kyfbutils.constantes.ConstantesFO;
import com.bbva.kyfb.kyfbws.converters.DtoInToDtoOut;
import com.bbva.kyfb.kyfbws.converters.DtoOutToDtoIn;

/**
 * The Class SrvFicherosConfeccionV01.
 */
@HttpService(serviceName="servicioFConfeccionHttp")
@Component
public class SrvFicherosConfeccionV01 implements IServicioFicheroConfeccionV01 {

	/** The servicio ficheros bo. */
	@Resource (name="servicioFicherosBO")  
	IFicherosBo servicioFicherosBO;
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileResponse getComponentesConfeccionReferencia(final InfoFileRequest info) {
		InfoFileResponse infoF = new InfoFileResponse();
		ArrayList<InfoFile> infoFiles = new ArrayList<InfoFile>();
		try {
			if(ConstantesFO.FECHA_CREACION.equalsIgnoreCase(info.getsTipoFecha())){
				throw new ExcepcionEjecucionAplicacion(Errores_kyfb_servicios.NO_EXISTEN_DATOS_A_LISTAR);
			}
			FicheroInfo ficheroInfo = DtoOutToDtoIn.infoFileRequestToFicheroInfo(info);
			List<FicheroConfeccion> list=servicioFicherosBO.getComponentesConfeccionReferencia(ficheroInfo);
			infoFiles= DtoInToDtoOut.ficherosConfeccionToInfoFiles(list);
			infoF.setTotalComponentes(servicioFicherosBO.getTotalComponentesConfeccionReferencia(ficheroInfo));
			infoF.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch(ExcepcionEjecucionAplicacion ea) {
			infoF.setTotalComponentes(infoFiles.size());
			infoF.setCodError(ea.getCodigoError().toString());
		}
		infoF.setInfoFiles(infoFiles);
		return infoF;
	}

	//TODO: TIPO DATO DeletedFilesResponse hay que meter COD_ERROR general no solo individual.
	/**
	 * {@inheritDoc}
	 */
	@Override
	public DeletedFilesResponse deleteComponenteConfeccion(final InfoToDeleteRequestMaking info) {
		DeletedFilesResponse deletedFiles = new DeletedFilesResponse();
		InfoDeletedFiles infoDeletedFiles= new InfoDeletedFiles();
		ArrayList <InfoDeletedFile> listaDeletedFiles= new ArrayList<InfoDeletedFile>();
		if(info != null && info.getInfoDeletedFiles() != null && info.getInfoDeletedFiles().getInfoDeletedFiles()!= null) {
			FicheroInfo fichero;
			UsuarioInfo usuario;
			for(InfoDeletedFile file: info.getInfoDeletedFiles().getInfoDeletedFiles()) {
				fichero = new FicheroInfo();
				try {
					usuario = DtoOutToDtoIn.infoUserReferenceMakingToUsuarioInfo(info.getInfoUser());
					fichero = DtoOutToDtoIn.infoDeletedFileAndUsuarioInfoToFicheroInfo(file,usuario);
					servicioFicherosBO.deleteComponenteConfeccion(fichero, usuario);
					file.setCodError(Errores_kyfb_servicios.OK.toString());
				} catch(ExcepcionEjecucionAplicacion ea) {
					file.setCodError(ea.getCodigoError().toString());
				}
				listaDeletedFiles.add(file);
			}
		}
		infoDeletedFiles.setInfoDeletedFiles(listaDeletedFiles);
		deletedFiles.setInfoDeletedFiles(infoDeletedFiles);
		return deletedFiles;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileAuditResponse getAuditoriaComponenteConfeccion(final InfoFileAuditRequest info) {
		InfoFileAuditResponse file= new InfoFileAuditResponse();
		ArrayList<InfoFileAudit> lista= new ArrayList<InfoFileAudit>();
		FicheroInfo ficheroInfo = new FicheroInfo();
		try{
			ficheroInfo= DtoOutToDtoIn.infoFileAuditRequestToFicheroInfo(info);
			lista = DtoInToDtoOut.auditoriasBoToInfoFileAuditsFacade(servicioFicherosBO.getAuditoriaComponenteConfeccion(ficheroInfo));
			file.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch (ExcepcionEjecucionAplicacion ea) {
			file.setCodError(ea.getCodigoError().toString());
		}
		file.setInfoFilesAudit(lista);
		return file;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileMiFIDResponse getComponenteTipoMifid(final InfoFileMiFIDRequest info) {
		InfoFileMiFIDResponse infoResp = new InfoFileMiFIDResponse();
		infoResp.setCodError("MODO DUMMY");
		InfoFileMiFID  infoM = new InfoFileMiFID();
		infoM.setsTipoMiFID("CO");
		infoResp.setInfoMifid(infoM);
		return infoResp;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileCompaniesResponse getConsultaEmpresasAsociadas(final InfoFileCompaniesRequest info) {
		InfoFileCompaniesResponse infoResp = new InfoFileCompaniesResponse();
		infoResp.setCodError("MODO DUMMY");
		ArrayList<InfoFileCompanie> infoComps = new ArrayList<InfoFileCompanie>();
		InfoFileCompanie infoC = new InfoFileCompanie();
		infoC.setDniNif("1234567R");
		infoC.setsCodigoCliente("1234567b");
		infoC.setsCodigoClienteR("1234567a");
		infoC.setsNombre("empresa");
		infoComps.add(infoC);
		infoResp.setInfoCompanies(infoComps);
		return infoResp;
	}
}
